﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using NUnit.Framework;
using ProyectoBastanteo.Dominio;
using ProyectoBastanteo.Persistencia;

namespace ProyectoBastanteo.Prueba
{

    public class RepresentantePrueba 
    {
        RepresentanteDAO RepDAO = null;
        Representante registro = null;
        
        ClienteDAO clienteDAO = null; 
        Cliente RegCli = null;
               
        [TestFixtureSetUp]
        public void InicializarPruebas()
        {
            RepDAO = new Persistencia.RepresentanteDAO();
            clienteDAO = new ClienteDAO();
            foreach (Representante Represen in RepDAO.ListarTodos())
                RepDAO.Eliminar(Represen);
            Cliente RegCli = new Cliente();

        }

        [Test]
        public void Test1_Crear()
        {
            Representante RepACrear = new Representante();
            
            // validando que se cree correctamente
            RegCli = clienteDAO.Obtener(1);
             //RegCli.codclie = 101;
            RepACrear.codclie = RegCli;
            RepACrear.nombrep = "Cecilia Lopez Rengifo";
            //RepACrear.nudorep = "07757522";
            RepACrear.tidorep = "DNI";
            RepACrear.gruprep = "A";
            RepACrear.cargrep = "Jefe de Cobranzas";

            RepACrear.nudorep = null;
            Assert.Catch<Exception>(delegate
            {
                registro = RepDAO.Crear(RepACrear);
            });

            RepACrear.nudorep = "07757522";

            Assert.DoesNotThrow(delegate
            {
                registro = RepDAO.Crear(RepACrear);
            });

            Assert.IsNotNull(registro);
            Assert.AreEqual(registro.codclie.codclie, 1);
        }


        [Test]
        public void Test2_Obtener()
        {
            Representante RepreObtenido = null;
            // 1. Validar que se retorne nulo al obtener un representante inexistente
            Assert.DoesNotThrow(delegate
            {
                RepreObtenido = RepDAO.Obtener("27398127");
            });
            Assert.IsNull(RepreObtenido);
            // 2. Validar que se obtenga el representante creado satisfactoriamente
            Assert.DoesNotThrow(delegate
            {
                RepreObtenido = RepDAO.Obtener("07757522");
            });
            Assert.IsNotNull(RepreObtenido);
            // 3. Validar que el ruc obtenido sea el creado anteriormente
            Assert.AreEqual(RepreObtenido.nudorep, "07757522");
        }


        [Test]
        public void Test3_Modificar()
        {


            Representante repreAModificar = RepDAO.Obtener("07757522");
            string documento = repreAModificar.tidorep;
            
            
            repreAModificar.nombrep = "Cecilia Aspillaga";
            repreAModificar.tidorep = "Pasaporte";
            repreAModificar.cargrep = "Jefe Finanzas";


            repreAModificar.gruprep = null;
            // 1. Validar que ocurrar un error al intentar modificar el representante con un grupo nulo
            Representante orepresentante = null;
            Assert.Catch<Exception>(delegate
            {
                orepresentante = RepDAO.Modificar(repreAModificar);
            });
            // 2. Validar que se modifique correctamente el representante
            
            repreAModificar.gruprep = "B";
            Assert.DoesNotThrow(delegate
            {
                orepresentante = RepDAO.Modificar(repreAModificar);
            });
            // 3. Validar que el representante modificado no sea nulo y que se haya modificado correntamente
            Assert.IsNotNull(orepresentante);
            Assert.AreNotEqual(documento, orepresentante.tidorep);

        }

        [Test]
        public void Test4_Eliminar()
        {
            Representante repreAEliminar = RepDAO.Obtener("07757522");
            Representante oerror = null;
            // 1. Validar que ocurre un error si se intenta eliminar un representante nulo
            Assert.Catch<Exception>(delegate
            {
                RepDAO.Eliminar(oerror);
            });
            // 2. Validar que se elimina correctamente el representante creado
            Assert.DoesNotThrow(delegate
            {
                RepDAO.Eliminar(repreAEliminar);
            });
            // 3. Validar que luego de eliminado se retorne nulo al obtenerlo
            Representante repreEliminado = RepDAO.Obtener("07757522");
            Assert.IsNull(repreEliminado);

        }

        [Test]
        public void Test5_Listar()
        {
            RepDAO.Crear(new Representante() { codclie = clienteDAO.Obtener(1), nombrep = "Margarita Cabello", tidorep = "DNI", nudorep = "45856875", cargrep = "Cobranza", gruprep = "B" });
            RepDAO.Crear(new Representante() { codclie = clienteDAO.Obtener(1), nombrep = "Cristina Leon", tidorep = "DNI", nudorep = "45268597", cargrep = "Jefe Ventas", gruprep = "C" });
            // 1. Validar que se listen los representantes existentes 
            ICollection<Representante> represExistentes = null;
            Assert.DoesNotThrow(delegate
            {
                represExistentes = RepDAO.ListarTodos();
            });
            // 2. Validar que se retornen al menos los 2 representantes creados previamente
            Assert.GreaterOrEqual(represExistentes.Count, 2);
            // 3. Validar que cada representante obtenido tenga un nrodocumento no nulo
            foreach (Representante repre in represExistentes)
                Assert.IsNotNull(repre.nudorep);
        }


    }
}
